
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ListChangeListener;
import javafx.collections.ListChangeListener.Change;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.text.Text;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author enrico
 */
public class ListaLibriController {

  private Biblioteca controller;
  private int nBiblioteca = 1;
  ListaLibriView llv1, llv2, llv3, llv4, llv5, llv6, llv7, llv8;
  private AggiungiLibroController alc = new AggiungiLibroController(this);
  private BorderPane bp, bpTop;
  Image addI = new Image(getClass().getResourceAsStream("Stili/plus.png"));
  ImageView addIV = new ImageView(addI);

  public ListaLibriController(Biblioteca contr) {
    controller = contr;
    try {
      llv1 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"1\" AND rimosso=0 ORDER BY Titolo ASC;");
      llv2 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"2\" AND rimosso=0 ORDER BY Titolo ASC;");
      llv3 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"3\" AND rimosso=0 ORDER BY Titolo ASC;");
      llv4 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"4\" AND rimosso=0 ORDER BY Titolo ASC;");
      llv5 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"5\" AND rimosso=0 ORDER BY Titolo ASC;");
      llv6 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"6\" AND rimosso=0 ORDER BY Titolo ASC;");
      llv7 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"7\" AND rimosso=0 ORDER BY Titolo ASC;");
      llv8 = new ListaLibriView("SELECT biblioteche.*,rientrato FROM biblioteche LEFT JOIN prestiti ON biblioteche.ID = prestiti.ID_libro WHERE sezione=\"8\" AND rimosso=0 ORDER BY Titolo ASC;");
      setListeners(llv1);
      setListeners(llv2);
      setListeners(llv3);
      setListeners(llv4);
      setListeners(llv5);
      setListeners(llv6);
      setListeners(llv7);
      setListeners(llv8);
      
    } catch (Exception ex) {
      Logger.getLogger(ListaLibriController.class.getName()).log(Level.SEVERE, null, ex);
      ex.printStackTrace();
    }
  }

  public BorderPane getView() throws ClassNotFoundException, SQLException {
    // ogni volta ne creo una diversa
    try {
      bp = new BorderPane();
      bpTop = new BorderPane();

      // Top
      Text titolo = new Text("Elenco libri della sezione " + decToRom(nBiblioteca));
      titolo.setId("titolo");
      bpTop.setCenter(titolo);

      Button addButton = new Button("Aggiungi", addIV);
      addButton.setId("green");
      addButton.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {
          alc.showPopup(nBiblioteca);
        }
      });

      bpTop.setRight(addButton);

      // "Bottom"
      bp.setTop(bpTop);
      bp.setMargin(bpTop, new Insets(0, 12, 12, 12));

      ListaLibriView llvN = null;


      bp.setCenter(currentLista());
      //llvN.getSelectionModel().select(0);
      // modifica panel
      bp.setBottom(controller.getModificaLibroController().getView());
      bp.setMargin(controller.getModificaLibroController().getView(), new Insets(12, 12, 0, 12));

      return bp;
    } catch (Exception ex) {
      Logger.getLogger(ListaLibriController.class.getName()).log(Level.SEVERE, null, ex);
    }

    return null;
  }

  private String decToRom(int numero) {
    switch (numero) {
      case 1:
        return "I";

      case 2:
        return "II";

      case 3:
        return "III";

      case 4:
        return "IV";
        
      case 5:
        return "DERIN - GODEAS";
       
      case 6:
        return "ANVGD";
      
      case 7:
        return "VII";
        
      case 8:
        return "VIII";

    }
    return null;
  }

  private void setListeners(ListaLibriView llvN) {
    llvN.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<LibroModel>() {

      @Override
      public void changed(ObservableValue<? extends LibroModel> libro, LibroModel arg1, LibroModel arg2) {
        if (libro != null && libro.getValue() != null) {
          // selected another row
          LibroModel mdl = libro.getValue(); // libromodel
          boolean prestato = true,eliminabile=true;

          try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:lib/biblioteche.db");
            Statement stat = conn.createStatement();

            ResultSet rs = stat.executeQuery("SELECT * FROM prestiti WHERE rientrato=0 AND id_libro=" + mdl.getID());
            int rc=0;
            while (rs.next()) {
              //rs.last();
              rc = rs.getRow();
              //rs.beforeFirst();
            }

            if (rc==Integer.valueOf(mdl.getQuantita())+1) {
              prestato = true;
            } else {
              prestato = false;
            }
            
            if (rc>0) eliminabile=false;

            rs.close();
            conn.close();
          } catch (Exception e) {
            System.out.println("LLC changed ->"+e.getMessage());
          }

          controller.getModificaLibroController().setLibroData(mdl.getSezione(), mdl.getTitolo(), mdl.getSottotitolo(), mdl.getAutore(), mdl.getEditore(), mdl.getAnno(), mdl.getSC(), mdl.getPRSC(), mdl.getPR(), mdl.getUnd(), mdl.getQuantita(), String.valueOf(mdl.getID()), prestato,eliminabile);
        }
      }
    });
  }

  void setModelNumber(int nBiblioteca) {
    this.nBiblioteca = nBiblioteca;
  }

  public BorderPane getRoot() {
    return controller.getRoot();
  }

  void refreshTable(Integer sezione) {

    try {
      switch (sezione) {
        case 1:
          llv1 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"1\" AND rimosso=0 ORDER BY Titolo ASC;");
        case 2:
          llv2 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"2\" AND rimosso=0 ORDER BY Titolo ASC;");
        case 3:
          llv3 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"3\" AND rimosso=0 ORDER BY Titolo ASC;");
        case 4:
          llv4 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"4\" AND rimosso=0 ORDER BY Titolo ASC;");
        case 5:
          llv5 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"5\" AND rimosso=0 ORDER BY Titolo ASC;");
        case 6:
          llv6 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"6\" AND rimosso=0 ORDER BY Titolo ASC;");
        case 7:
          llv7 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"7\" AND rimosso=0 ORDER BY Titolo ASC;");
        case 8:
          llv8 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"8\" AND rimosso=0 ORDER BY Titolo ASC;");
      }
    } catch (Exception e) {
    }

    // aggiorno vista nel caso
    if (sezione == nBiblioteca) {
      switch (sezione) {
        case 1:
          bp.setCenter(llv1);
          setListeners(llv1);
        case 2:
          bp.setCenter(llv2);
          setListeners(llv2);
        case 3:
          bp.setCenter(llv3);
          setListeners(llv3);
        case 4:
          bp.setCenter(llv4);
          setListeners(llv4);
        case 5:
          bp.setCenter(llv5);
          setListeners(llv5);
        case 6:
          bp.setCenter(llv6);
          setListeners(llv6);
        case 7:
          bp.setCenter(llv7);
          setListeners(llv7);
        case 8:
          bp.setCenter(llv8);
          setListeners(llv8);
      }
    }

  }

  void refreshTable(Integer sezioneNuova, int sezioneAttuale) {
    try {
      switch (sezioneAttuale) {
        case 1:
          llv1 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"1\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv1);
          setListeners(llv1);
        case 2:
          llv2 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"2\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv2);
          setListeners(llv2);
        case 3:
          llv3 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"3\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv3);
          setListeners(llv3);
        case 4:
          llv4 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"4\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv4);
          setListeners(llv4);
        case 5:
          llv5 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"5\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv5);
          setListeners(llv5);
        case 6:
          llv4 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"6\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv6);
          setListeners(llv6);
        case 7:
          llv7 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"7\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv7);
          setListeners(llv7);
        case 8:
          llv4 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"8\" AND rimosso=0 ORDER BY Titolo ASC;");
          bp.setCenter(llv8);
          setListeners(llv8);
      }

      switch (sezioneNuova) {
        case 1:
          llv1 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"1\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv1);
        case 2:
          llv2 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"2\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv2);
        case 3:
          llv3 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"3\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv3);
        case 4:
          llv4 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"4\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv4);
        case 5:
          llv4 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"5\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv5);
        case 6:
          llv6 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"6\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv6);
        case 7:
          llv7 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"7\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv7);
        case 8:
          llv8 = new ListaLibriView("SELECT * FROM biblioteche WHERE sezione=\"8\" AND rimosso=0 ORDER BY Titolo ASC;");
          setListeners(llv8);
      }

    } catch (Exception e) {
    }
  }

  void goToBook(LibroModel lm) {
    currentLista().goToBook(lm);
  }

  private ListaLibriView currentLista() {
    ListaLibriView llvN = null;

    switch (nBiblioteca) {
      case 1:
        llvN = llv1;
        break;
      case 2:
        llvN = llv2;
        break;
      case 3:
        llvN = llv3;
        break;
      case 4:
        llvN = llv4;
        break;
      case 5:
        llvN = llv5;
        break;
      case 6:
        llvN = llv6;
        break;
      case 7:
        llvN = llv7;
        break;
      case 8:
        llvN = llv8;
        break;
    }

    return llvN;
  }

  void setPrestato(int codiceLibro, int sezioneLibro) {
    if (sezioneLibro==1) llv1.setPrestato(codiceLibro);
    if (sezioneLibro==2) llv2.setPrestato(codiceLibro);
    if (sezioneLibro==3) llv3.setPrestato(codiceLibro);
    if (sezioneLibro==4) llv4.setPrestato(codiceLibro);
    if (sezioneLibro==5) llv5.setPrestato(codiceLibro);
    if (sezioneLibro==6) llv6.setPrestato(codiceLibro);
    if (sezioneLibro==7) llv7.setPrestato(codiceLibro);
    if (sezioneLibro==8) llv8.setPrestato(codiceLibro);
    
  }
  
  ListaLibriView getLista(int lista) {
    switch(lista) {
      case 1: return llv1;
      case 2: return llv2;
      case 3: return llv3;
      case 4: return llv4;
      case 5: return llv5;
      case 6: return llv6;
      case 7: return llv7;
      case 8: return llv8;
      
      default: return llv1;
    }
  }

  void subsituteModel(LibroModel lmn, String id) {
   ListaLibriView lista = getLista(Integer.valueOf(id));
   lista.substitute(lmn,id);
  }
}
